www.gusucode.com > VC++ Bresenham Line 课程资源 > VC++ Bresenham Line 课程资源/Bresenham画线算法/base.cpp

    /***************************************************************
用Bresenham画线算法绘制任意方向的直线
使用VC++6.0 编译成功
****************************************************************/
#include "stdafx.h"
#include "base.h"
#include <math.h>

//画线,右手坐标系(x向右,y向上),也适合左手坐标系
//起点:x0,y0
//终点:x1,y1
//画线颜色 color
void Bresenham_Line(HDC hdc,int x0,int y0,int x1,int y1,long color)
{
	int x,y,dx,dy,e; 
	int i,temp;
	int change=0;   //如果直线斜率<=1, change=0; 否则change=1 
	int Step_X=1,Step_Y=1;  //取值为1 或 -1 ,表示迭代过程中 x坐标和y坐标变化的方向
	dx=x1-x0, dy=y1-y0;

	if(dx<0)  {
		dx=-dx;  //dx始终为正
		Step_X=-1;//改变x的迭代方向为负,即每次迭代x减1
	}
	if(dy<0)  {
		dy=-dy;		//dy始终为正
		Step_Y=-1;  //改变y的迭代方向为负,即每次迭代y减1
	}
	if(dy>dx){      //如果斜率>1
		temp=dx;	//交换dx和dy
		dx=dy;
		dy=temp;   
		change=1;   //设置斜率>1标志
	}
	e=-dx, x=x0,y=y0;
	for(i=0;i<=dx;i++)
	{
		//画点
		SetPixel(hdc,x,y,color);		
		if(change)  y=y+Step_Y; //如果斜率>1, 每次先递增(或递减)y,而后判断x的变化
		else	  	x=x+Step_X; //如果斜率<=1,每次先递增(或递减)x,而后判断y的变化
		e=e+2*dy;
		if(e>=0)
		{
			if(change)	x=x+Step_X; //x的值比上一点有变化
			else        y=y+Step_Y; //y的值比上一点有变化
			e=e-2*dx;
		}
	}
}